10 मिनट में Go सीखें
Go (जिसे Golang के नाम से भी जाना जाता है) Google में डिजाइन की गई एक स्टैटिकली टाइप्ड, कंपाइल्ड प्रोग्रामिंग भाषा है। यह अपनी सरलता, दक्षता और कंकरेंसी के लिए उत्कृष्ट सपोर्ट के लिए जानी जाती है। यह ट्यूटोरियल आपको Go प्रोग्रामिंग जल्दी सीखने में मदद करेगा।
1. अपना पहला Go प्रोग्राम लिखना
आइए एक सरल प्रोग्राम से शुरू करते हैं। hello.go
नाम की एक फाइल बनाएं और निम्नलिखित कोड दर्ज करें:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
फाइल को सेव करें और टर्मिनल में निम्नलिखित कमांड चलाएं:
go run hello.go
आउटपुट होगा:
Hello, World!
यह सरल प्रोग्राम Go की बुनियादी संरचना प्रदर्शित करता है:
package main
पैकेज का नाम घोषित करता हैimport "fmt"
I/O ऑपरेशन्स के लिए फॉर्मेट पैकेज को इम्पोर्ट करता हैfunc main()
प्रोग्राम का एंट्री पॉइंट हैfmt.Println()
कंसोल पर टेक्स्ट प्रिंट करता है
2. बेसिक सिंटैक्स
Go का साफ और सरल सिंटैक्स है। Python के विपरीत, Go कोड ब्लॉक्स को परिभाषित करने के लिए कर्ली ब्रेसेस {}
का उपयोग करता है और स्टेटमेंट्स के अंत में सेमीकोलन की आवश्यकता होती है (हालांकि वे आमतौर पर स्वचालित रूप से डाले जाते हैं)।
// यह एक सिंगल-लाइन कमेंट है
fmt.Println("Hello, World!")
/*
यह एक मल्टी-लाइन कमेंट है
जो कई लाइनों में फैला हुआ है
*/
Go में बेसिक सिंटैक्स नियम:
- कोड ब्लॉक्स: कर्ली ब्रेसेस
{}
द्वारा परिभाषित - कमेंट्स: सिंगल-लाइन कमेंट्स
//
से शुरू होते हैं, मल्टी-लाइन/* */
से - स्टेटमेंट्स: सेमीकोलन के साथ समाप्त होते हैं (स्वचालित रूप से डाले जाते हैं)
- पैकेज डिक्लेरेशन: हर फाइल एक पैकेज डिक्लेरेशन से शुरू होती है
3. वेरिएबल्स और डेटा टाइप्स
Go स्टैटिकली टाइप्ड है, जिसका मतलब है कि आपको वेरिएबल टाइप्स घोषित करने होंगे। हालांकि, Go :=
ऑपरेटर के साथ टाइप इन्फेरेंस का समर्थन करता है।
वेरिएबल डिक्लेरेशन के तरीके:
// एक्सप्लिसिट टाइप डिक्लेरेशन
var name string = "John"
var age int = 25
// टाइप इन्फेरेंस
name := "John"
age := 25
// मल्टीपल वेरिएबल डिक्लेरेशन
var x, y int = 10, 20
x, y := 10, 20
Go के मुख्य बेसिक डेटा टाइप्स:
- इंटीजर टाइप्स:
int
,int8
,int16
,int32
,int64
,uint
,uint8
,uint16
,uint32
,uint64
,uintptr
- फ्लोट टाइप्स:
float32
,float64
- स्ट्रिंग:
string
- बूलियन:
bool
- कॉम्प्लेक्स टाइप्स:
complex64
,complex128
3.1 न्यूमेरिक टाइप्स
Go विभिन्न उपयोग मामलों के लिए विभिन्न न्यूमेरिक टाइप्स प्रदान करता है:
// इंटीजर टाइप्स
var age int = 25
var smallNumber int8 = 127
var largeNumber int64 = 9223372036854775807
// फ्लोट टाइप्स
var temperature float32 = 36.5
var pi float64 = 3.14159265359
// कॉम्प्लेक्स नंबर्स
var complexNum complex64 = 3 + 4i
3.2 स्ट्रिंग टाइप
Go में स्ट्रिंग्स बाइट्स के अनुक्रम होते हैं और अपरिवर्तनीय होते हैं:
// स्ट्रिंग डिक्लेरेशन
var greeting string = "Hello, Go!"
name := "Alice"
// स्ट्रिंग ऑपरेशन्स
fmt.Println(len(greeting)) // स्ट्रिंग लंबाई
fmt.Println(greeting[0]) // पहला कैरेक्टर एक्सेस करें (बाइट)
fmt.Println(greeting[0:5]) // स्ट्रिंग स्लाइसिंग
fmt.Println(strings.ToUpper(name)) // अपरकेस में कन्वर्ट करें
3.3 बूलियन टाइप
बूलियन टाइप के दो मान होते हैं: true
और false
:
var isActive bool = true
var isComplete bool = false
// बूलियन ऑपरेशन्स
result1 := true && false // false
result2 := true || false // true
result3 := !true // false
4. कॉन्स्टेंट्स
कॉन्स्टेंट्स const
कीवर्ड का उपयोग करके घोषित किए जाते हैं और इन्हें बदला नहीं जा सकता:
const Pi = 3.14159
const MaxUsers = 1000
// मल्टीपल कॉन्स्टेंट्स
const (
StatusOK = 200
StatusNotFound = 404
StatusError = 500
)
// टाइप्ड कॉन्स्टेंट्स
const Version string = "1.0.0"
5. डेटा स्ट्रक्चर्स
Go डेटा को स्टोर और मैनिपुलेट करने के लिए कई बिल्ट-इन डेटा स्ट्रक्चर्स प्रदान करता है।
5.1 ऐरेज़
ऐरेज़ एक ही टाइप के तत्वों के फिक्स्ड-साइज अनुक्रम होते हैं:
// ऐरे डिक्लेरेशन
var numbers [5]int = [5]int{1, 2, 3, 4, 5}
names := [3]string{"Alice", "Bob", "Charlie"}
// एलिमेंट्स एक्सेस करना
fmt.Println(numbers[0]) // 1
numbers[0] = 10 // एलिमेंट मॉडिफाई करें
// ऐरे लंबाई
fmt.Println(len(numbers)) // 5
5.2 स्लाइसेज़
स्लाइसेज़ डायनामिक ऐरेज़ होते हैं जो बढ़ और सिकुड़ सकते हैं:
// स्लाइस डिक्लेरेशन
numbers := []int{1, 2, 3, 4, 5}
var emptySlice []int
// ऐरेज़ से स्लाइसेज़ बनाना
arr := [5]int{1, 2, 3, 4, 5}
slice := arr[1:4] // [2, 3, 4]
// स्लाइस ऑपरेशन्स
numbers = append(numbers, 6) // एलिमेंट जोड़ें
numbers = append(numbers, 7, 8, 9) // मल्टीपल एलिमेंट्स जोड़ें
// स्लाइस कैपेसिटी और लंबाई
fmt.Println(len(numbers)) // लंबाई: 9
fmt.Println(cap(numbers)) // कैपेसिटी: 10 (भिन्न हो सकती है)
5.3 मैप्स
मैप्स की-वैल्यू पेयर्स के अनऑर्डर्ड कलेक्शन होते हैं:
// मैप डिक्लेरेशन
student := map[string]interface{}{
"name": "John",
"age": 20,
"major": "Computer Science",
}
// अल्टरनेटिव डिक्लेरेशन
var scores map[string]int = make(map[string]int)
scores["math"] = 95
scores["science"] = 88
// एक्सेसिंग और मॉडिफाइंग
fmt.Println(student["name"])
student["age"] = 21
student["gpa"] = 3.8
// सेफ एक्सेस
if phone, exists := student["phone"]; exists {
fmt.Println(phone)
} else {
fmt.Println("Phone not provided")
}
// मैप पर इटरेट करना
for key, value := range student {
fmt.Printf("%s: %v\n", key, value)
}
5.4 स्ट्रक्ट्स
स्ट्रक्ट्स फील्ड्स के कलेक्शन होते हैं जिनके अलग-अलग टाइप्स हो सकते हैं:
// स्ट्रक्ट डेफिनिशन
type Person struct {
Name string
Age int
City string
}
// स्ट्रक्ट इंस्टेंसेज़ बनाना
person1 := Person{"Alice", 25, "New York"}
person2 := Person{
Name: "Bob",
Age: 30,
City: "London",
}
// फील्ड्स एक्सेस करना
fmt.Println(person1.Name)
person1.Age = 26
6. ऑपरेशन्स और ऑपरेटर्स
Go विभिन्न कम्प्यूटेशन्स और कम्पेरिजंस के लिए ऑपरेटर्स का एक समृद्ध सेट प्रदान करता है।
- अरिथमेटिक ऑपरेटर्स:
+
,-
,*
,/
,%
(मॉड्यूलस) - कम्पेरिजन ऑपरेटर्स:
==
,!=
,>
,<
,>=
,<=
- लॉजिकल ऑपरेटर्स:
&&
,||
,!
- बिटवाइज ऑपरेटर्स:
&
,|
,^
,<<
,>>
- असाइनमेंट ऑपरेटर्स:
=
,+=
,-=
,*=
,/=
6.1 अरिथमेटिक ऑपरेटर्स
a, b := 10, 3
fmt.Printf("Addition: %d\n", a + b) // 13
fmt.Printf("Subtraction: %d\n", a - b) // 7
fmt.Printf("Multiplication: %d\n", a * b) // 30
fmt.Printf("Division: %d\n", a / b) // 3
fmt.Printf("Modulus: %d\n", a % b) // 1
6.2 कम्पेरिजन ऑपरेटर्स
x, y := 5, 10
fmt.Printf("Equal: %t\n", x == y) // false
fmt.Printf("Not equal: %t\n", x != y) // true
fmt.Printf("Greater than: %t\n", x > y) // false
fmt.Printf("Less than: %t\n", x < y) // true
6.3 लॉजिकल ऑपरेटर्स
a, b := true, false
fmt.Printf("AND operation: %t\n", a && b) // false
fmt.Printf("OR operation: %t\n", a || b) // true
fmt.Printf("NOT operation: %t\n", !a) // false
7. कंट्रोल फ्लो
Go प्रोग्राम एक्जीक्यूशन को मैनेज करने के लिए कई कंट्रोल फ्लो स्टेटमेंट्स प्रदान करता है।
7.1 if स्टेटमेंट्स
age := 20
if age >= 18 {
fmt.Println("Adult")
} else if age >= 13 {
fmt.Println("Teen")
} else {
fmt.Println("Child")
}
// शॉर्ट स्टेटमेंट के साथ if
if score := 85; score >= 90 {
fmt.Println("Grade: A")
} else if score >= 80 {
fmt.Println("Grade: B")
} else {
fmt.Println("Grade: C")
}
7.2 for लूप्स
Go में केवल एक लूप कंस्ट्रक्ट है: for
// बेसिक for लूप
for i := 0; i < 5; i++ {
fmt.Println(i)
}
// व्हाइल-स्टाइल लूप
count := 0
for count < 5 {
fmt.Println(count)
count++
}
// इनफिनिट लूप
for {
fmt.Println("This will run forever")
break // बाहर निकलने के लिए break का उपयोग करें
}
// रेंज लूप (स्लाइसेज़, ऐरेज़, मैप्स के लिए)
fruits := []string{"apple", "banana", "cherry"}
for index, fruit := range fruits {
fmt.Printf("%d: %s\n", index, fruit)
}
7.3 switch स्टेटमेंट्स
day := "Monday"
switch day {
case "Monday":
fmt.Println("Start of the week")
case "Friday":
fmt.Println("Weekend is near")
case "Saturday", "Sunday":
fmt.Println("Weekend!")
default:
fmt.Println("Regular day")
}
// एक्सप्रेशन के बिना switch
score := 85
switch {
case score >= 90:
fmt.Println("Grade: A")
case score >= 80:
fmt.Println("Grade: B")
case score >= 70:
fmt.Println("Grade: C")
default:
fmt.Println("Grade: F")
}
8. फंक्शन्स
Go में फंक्शन्स फर्स्ट-क्लास सिटीजन हैं और मल्टीपल रिटर्न वैल्यूज का समर्थन करते हैं।
8.1 बेसिक फंक्शन्स
func greet(name string) string {
return "Hello, " + name + "!"
}
// फंक्शन को कॉल करना
message := greet("John")
fmt.Println(message)
8.2 मल्टीपल रिटर्न वैल्यूज
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, fmt.Errorf("cannot divide by zero")
}
return a / b, nil
}
// मल्टीपल रिटर्न वैल्यूज का उपयोग करना
result, err := divide(10, 2)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
8.3 नेम्ड रिटर्न वैल्यूज
func calculateRectangle(width, height float64) (area float64, perimeter float64) {
area = width * height
perimeter = 2 * (width + height)
return // नेक्ड रिटर्न
}
area, perimeter := calculateRectangle(5, 3)
fmt.Printf("Area: %.2f, Perimeter: %.2f\n", area, perimeter)
8.4 वेरिएडिक फंक्शन्स
func sum(numbers ...int) int {
total := 0
for _, num := range numbers {
total += num
}
return total
}
fmt.Println(sum(1, 2, 3, 4)) // 10
fmt.Println(sum(5, 10, 15)) // 30
9. पॉइंटर्स
Go में पॉइंटर्स हैं लेकिन C/C++ की तुलना में सरल सिंटैक्स के साथ:
func modifyValue(x *int) {
*x = *x * 2
}
func main() {
value := 10
fmt.Println("Before:", value) // 10
modifyValue(&value)
fmt.Println("After:", value) // 20
}
10. मेथड्स
मेथड्स रिसीवर आर्गुमेंट वाले फंक्शन्स होते हैं:
type Rectangle struct {
Width float64
Height float64
}
// वैल्यू रिसीवर के साथ मेथड
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
// पॉइंटर रिसीवर के साथ मेथड
func (r *Rectangle) Scale(factor float64) {
r.Width *= factor
r.Height *= factor
}
rect := Rectangle{Width: 5, Height: 3}
fmt.Println("Area:", rect.Area()) // 15
rect.Scale(2)
fmt.Println("Scaled Area:", rect.Area()) // 60
11. इंटरफेसेज़
इंटरफेसेज़ मेथड सिग्नेचर्स को परिभाषित करते हैं जिन्हें टाइप्स इम्प्लीमेंट कर सकते हैं:
type Shape interface {
Area() float64
Perimeter() float64
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}
func (c Circle) Perimeter() float64 {
return 2 * 3.14159 * c.Radius
}
func printShapeInfo(s Shape) {
fmt.Printf("Area: %.2f, Perimeter: %.2f\n", s.Area(), s.Perimeter())
}
circle := Circle{Radius: 5}
printShapeInfo(circle)
12. एरर हैंडलिंग
Go एक्सेप्शन्स के बजाय एक्सप्लिसिट एरर हैंडलिंग का उपयोग करता है:
func readFile(filename string) (string, error) {
data, err := os.ReadFile(filename)
if err != nil {
return "", fmt.Errorf("failed to read file %s: %w", filename, err)
}
return string(data), nil
}
content, err := readFile("example.txt")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Content:", content)
13. गोरूटीन्स के साथ कंकरेंसी
गोरूटीन्स Go रनटाइम द्वारा प्रबंधित लाइटवेट थ्रेड्स हैं:
func worker(id int) {
for i := 0; i < 3; i++ {
fmt.Printf("Worker %d: %d\n", id, i)
time.Sleep(time.Millisecond * 100)
}
}
func main() {
// मल्टीपल गोरूटीन्स शुरू करें
for i := 1; i <= 3; i++ {
go worker(i)
}
// गोरूटीन्स के पूरा होने का इंतजार करें
time.Sleep(time.Second)
fmt.Println("All workers completed")
}
14. चैनल्स
चैनल्स गोरूटीन्स के बीच कम्युनिकेशन के लिए उपयोग किए जाते हैं:
func producer(ch chan<- int) {
for i := 0; i < 5; i++ {
ch <- i // चैनल को वैल्यू भेजें
time.Sleep(time.Millisecond * 100)
}
close(ch) // काम पूरा होने पर चैनल बंद करें
}
func consumer(ch <-chan int) {
for value := range ch {
fmt.Println("Received:", value)
}
}
func main() {
ch := make(chan int, 3) // बफर्ड चैनल
go producer(ch)
consumer(ch)
fmt.Println("Channel communication completed")
}
15. फाइल ऑपरेशन्स
Go फाइल्स पढ़ने और लिखने के लिए सरल मेथड्स प्रदान करता है:
// फाइल्स पढ़ना
data, err := os.ReadFile("example.txt")
if err != nil {
fmt.Println("Error reading file:", err)
return
}
fmt.Println("File content:", string(data))
// फाइल्स लिखना
content := "Hello, Go!\n"
err = os.WriteFile("output.txt", []byte(content), 0644)
if err != nil {
fmt.Println("Error writing file:", err)
return
}
fmt.Println("File written successfully")
16. पैकेजेस और मॉड्यूल्स
Go मॉड्यूल्स डिपेंडेंसीज और पैकेज वर्जन्स को मैनेज करते हैं:
// स्टैंडर्ड लाइब्रेरी पैकेजेस इम्पोर्ट करना
import (
"fmt"
"math"
"strings"
)
func main() {
fmt.Println(math.Sqrt(16)) // 4
fmt.Println(strings.ToUpper("go")) // GO
}
अपना खुद का पैकेज बनाने के लिए, अपने पैकेज नाम के साथ एक डायरेक्टरी बनाएं और उनके नामों को कैपिटलाइज़ करके फंक्शन्स को एक्सपोर्ट करें।
17. टेस्टिंग
Go में बिल्ट-इन टेस्टिंग सपोर्ट है:
// math_test.go फाइल में
package main
import "testing"
func TestAdd(t *testing.T) {
result := add(2, 3)
expected := 5
if result != expected {
t.Errorf("add(2, 3) = %d; want %d", result, expected)
}
}
func add(a, b int) int {
return a + b
}
टेस्ट्स चलाएं: go test
18. बेस्ट प्रैक्टिसेज़
- अपने कोड को फॉर्मेट करने के लिए
gofmt
का उपयोग करें - Go नेमिंग कन्वेंशन्स का पालन करें (वेरिएबल्स के लिए camelCase, एक्सपोर्ट्स के लिए PascalCase)
- एरर्स को एक्सप्लिसिटली हैंडल करें
- एब्स्ट्रक्शन के लिए इंटरफेसेज़ का उपयोग करें
- इनहेरिटेंस पर कंपोजिशन को प्राथमिकता दें
- व्यापक टेस्ट्स लिखें
- जब भी संभव हो स्टैंडर्ड लाइब्रेरी का उपयोग करें
यह ट्यूटोरियल Go प्रोग्रामिंग की आवश्यक सुविधाओं को कवर करता है। अभ्यास के साथ, आप Go की शक्तिशाली सुविधाओं का उपयोग करके कुशल और कंकरेंट एप्लिकेशन्स बनाने में सक्षम होंगे।